const PI = 3.14159265358979324;
const x_pi = 3.14159265358979324 * 3000.0 / 180.0;

function formatTime(date) {

    if (typeof date == 'string' || 'number') {
        try {
            date = date.replace(/-/g, '/') //兼容ios
        } catch (error) {}
        date = new Date(date)
    }
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    const hour = date.getHours()
    const minute = date.getMinutes()
    const second = date.getSeconds()

    return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, '00'].map(formatNumber).join(':')

}

function formatNumber(n) {
    n = n.toString()
    return n[1] ? n : '0' + n
}
// 时间戳转日期
function stampToDate(number) {

    var formateArr = ['Y', 'M', 'D'];

    var date = new Date(number * 1000);
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()


    return [year, month, day].map(formatNumber).join('-')
}


//日期转时间戳
function dateToStamp(data) {
    const dataTime = new Date(data.replace(/-/g, "/"));
    const respone = dataTime.getTime() / 1000;
    return respone;
}

//gcj02转百度
function gcj02tobd09(lng, lat) {
    var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_pi);
    var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_pi);
    var bd_lng = z * Math.cos(theta) + 0.0065;
    var bd_lat = z * Math.sin(theta) + 0.006;
    return {
        'lat': bd_lat,
        'lon': bd_lng
    }
}

function wgs84togcj02(lng, lat) {
    if (this.outOfChina(lat, lng))
        return {
            'lat': lat,
            'lon': lng
        };

    var d = this.delta(lat, lng);
    return {
        'lat': lat + d.lat,
        'lon': lng + d.lon
    };
}

//得到时间格式2018-10-02
const formatDate = data => {
    const date = new Date(data)
    // console.log(data)
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    return [year, month, day].map(formatNumber).join('-')
}
// 时分秒转换时间戳
function time_to_sec(time) {
    if (time !== null) {
        let s = "";
        s = Date.parse('1970-01-01 ' + time) / 1000
        return s;
    }
}
module.exports = {
    formatTime: formatTime,
    stampToDate: stampToDate,
    dateToStamp: dateToStamp,
    gcjDecrypt: gcjDecrypt,
    outOfChina: outOfChina,
    delta: delta,
    wgs84togcj02: wgs84togcj02,
    gcj02tobd09: gcj02tobd09,
    transformLat: transformLat,
    transformLon: transformLon,
    formatDate,
    time_to_sec: time_to_sec
}



//坐标转换
function gcjDecrypt(gcjLat, gcjLon) {
    if (this.outOfChina(gcjLat, gcjLon)) {
        return {
            'lat': gcjLat,
            'lon': gcjLon
        };
    }
    var d = this.delta(gcjLat, gcjLon);
    return {
        'lat': gcjLat - d.lat,
        'lon': gcjLon - d.lon
    };
}

function delta(lat, lon) {
    // Krasovsky 1940
    // a = 6378245.0, 1/f = 298.3
    // b = a * (1 - f)
    // ee = (a^2 - b^2) / a^2;
    var a = 6378245.0; //  a: 卫星椭球坐标投影到平面地图坐标系的投影因子。
    var ee = 0.00669342162296594323; //  ee: 椭球的偏心率。
    var dLat = this.transformLat(lon - 105.0, lat - 35.0);
    var dLon = this.transformLon(lon - 105.0, lat - 35.0);
    var radLat = lat / 180.0 * PI;
    var magic = Math.sin(radLat);
    magic = 1 - ee * magic * magic;
    var sqrtMagic = Math.sqrt(magic);
    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * PI);
    dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * PI);
    return {
        'lat': dLat,
        'lon': dLon
    };
}

function transformLat(x, y) {
    var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x));
    ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(y * PI) + 40.0 * Math.sin(y / 3.0 * PI)) * 2.0 / 3.0;
    ret += (160.0 * Math.sin(y / 12.0 * PI) + 320 * Math.sin(y * PI / 30.0)) * 2.0 / 3.0;
    return ret;
}

function transformLon(x, y) {
    var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x));
    ret += (20.0 * Math.sin(6.0 * x * PI) + 20.0 * Math.sin(2.0 * x * PI)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(x * PI) + 40.0 * Math.sin(x / 3.0 * PI)) * 2.0 / 3.0;
    ret += (150.0 * Math.sin(x / 12.0 * PI) + 300.0 * Math.sin(x / 30.0 * PI)) * 2.0 / 3.0;
    return ret;
}

function outOfChina(lat, lon) {
    if (lon < 72.004 || lon > 137.8347)
        return true;
    if (lat < 0.8293 || lat > 55.8271)
        return true;
    return false;
}